<?php

namespace app\controller;

use GuzzleHttp\Exception\RequestException;
use think\facade\Log;
use think\Request;
use app\model\Product as productModel;
use GuzzleHttp\Client;

class Product
{
    /**
     * 商品发布
     * @param Request $request
     * @return \think\response\Json 商品信息
     */
    public function publishProduct(Request $request){

        // 用户信息
        $userId = $request->user['id'];

        // 商品描述，商品图片，商品价格，位置,联系方式类型,联系方式,发货方式
        $productDescription = $request->param('productDescription','');
        $productImgs = $request->param('productImgs','');
        $productPrice = $request->param('productPrice','');
        $location = $request->param('location','');
        $contactType = $request->param('contactType','');
        $contact = $request->param('contact','');
        $shippingMethod = $request->param('shippingMethod','');


        // 判断商品描述，商品图片，商品价格，位置,联系方式类型,联系方式,发货方式合法性
        if (empty($productDescription) || empty($productImgs) || empty($productPrice) || empty($location) || empty($contactType) || empty($contact) || empty($shippingMethod)) {

            return json([
                'code' => 400,
                'msg' => "缺少参数"
            ]);
        }

        // 判断商品图片类型合法性
        if (!is_array($productImgs) || count($productImgs) <= 0) {
            return json([
                'code' => 422,
                'msg' => "商品图片错误"
            ]);
        }


        try {

            // apiKey
            $apiKey = 'sk-cucdubrepzycxrdjyhixqppuoxkofjiousfklqlwdpqmxeyv';

            // 模型
            $model = 'tencent/Hunyuan-MT-7B';

            $client = new Client([
                'base_uri' => 'https://api.siliconflow.cn/v1',
                'timeout' => 10,      // 请求超时时间
                'headers' => [
                    'Authorization' => 'Bearer ' . $apiKey, // Bearer Token 认证
                    'Content-Type' => 'application/json'    // 请求体为 JSON 格式
                ],
                'verify' => false   //关闭 SSL 证书验证
            ]);

            // - 角色设定：内容安全审核员
            $prompt = "你是一名内容安全审核员。请判断以下商品描述是否包含违法、色情、暴力、欺诈、违禁品、高仿等违规内容。只回答“合规”或“违规”。\n\n商品描述：{$productDescription}";


            $response = $client->post('/chat/completions', [
                'json' => [
                    'model' => $model,  // 指定使用的模型
                    'messages' => [
                        [
                            'role' => 'user',       // 用户角色
                            'content' => $prompt    // 输入提示词
                        ]
                    ],   // 消息列表
                    'max_tokens' => 10,     // 限制模型最大生成长度
                    'temperature' => 0.0    // 控制随机性：0.0 表示确定性输出
                ]
            ]);


            // 解析 API 响应
            $result = json_decode($response->getBody(), true);  // 转为关联数组
            // 提取模型生成的文本内容，并去除首尾空白字符
            $aiReply = trim($result['choices'][0]['message']['content'] ?? '');

            // 判断审核结果
            if ($aiReply !== '合规') {
                return json(['code' => 403, 'msg' => '商品描述包含违规内容，无法发布']);
            }

        }  catch (RequestException $e) {

            Log::error('AI 审核请求失败: ' . $e->getMessage());
            return json(['code' => 500, 'msg' => '审核服务异常，请稍后再试']);

        } catch (\Exception $e) {

            Log::error('AI 审核异常: ' . $e->getMessage());
            return json(['code' => 500, 'msg' => '系统内部错误']);

        }

        try {

            // 商品发布
            $product = productModel::publishProduct($userId,$productDescription,$productImgs,$productPrice,$location,$contactType,$contact,$shippingMethod);

            // 商品发布成功
            return json([
                'code' => 200,
                'msg' => "商品发布成功",
                'data' => $product
            ]);

        }catch (\Exception $e){

            // 系统异常
            Log::error('商品发布失败：' . $e->getMessage() . ' | 时间：' . date('Y-m-d H:i:s'));

            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);

        }



    }


    /**
     * 获取我发布的商品
     * @param Request $request
     * @return \think\response\Json
     */
    public function getMyPostsProduct(Request $request){

        // 用户信息
        $userId = $request->user['id'];

        $status = $request->param('status','-1');
        $currentPage = $request->param('currentPage',1);

        try {
            $product = productModel::getProductByUserId($userId,$status,$currentPage);

            return json([
                'code' => 200,
                'data' => $product,
            ]);

        }catch (\Exception $e){

            Log::error('获取商品失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));

            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }

    }


    /**
     * 删除我发布的已下架的商品
     * @param Request $request
     * @return \think\response\Json
     */
    public function delMyPostsUnlistedProduct(Request $request){

        // 用户信息
        $userId = $request->user['id'];

        $delProductId = $request->param('delProductId','');

        if (empty($delProductId)) {

            return json([
                'code' => 422,
                'msg' => "商品id缺失"
            ]);
        }

        try {
            $result = productModel::delMyPostsUnlistedProduct($userId,$delProductId);

            if ($result) {
                return json([
                    'code' => 200,
                    'msg' => "删除成功"
                ]);
            }else{
                return json([
                    'code' => 422,
                    'msg' => "商品不存在或无权删除"
                ]);
            }
        }catch (\Exception $e){

            Log::error('商品删除失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));

            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }


    }

    /**
     * 下架我发布的在卖商品
     * @param Request $request
     * @return \think\response\Json
     */
    public function unlistedMyPostsForSaleProduct(Request $request){

        // 用户信息
        $userId = $request->user['id'];

        $unlistedProductId = $request->param('unlistedProductId','');

        if (empty($unlistedProductId)) {

            return json([
                'code' => 422,
                'msg' => "商品id缺失"
            ]);
        }

        try {
            $result = productModel::unlistedMyPostsForSaleProduct($userId,$unlistedProductId);

            if ($result) {
                return json([
                    'code' => 200,
                    'msg' => "下架成功",
                ]);
            }else{
                return json([
                    'code' => 422,
                    'msg' => "商品不存在或无权下架"
                ]);
            }
        }catch (\Exception $e){
            Log::error('商品下架失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));
            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }
    }


    /**
     * 重新上架商品
     * @param Request $request
     * @return \think\response\Json
     */
    public function relistProduct(Request $request)
    {
        // 用户信息
        $userId = $request->user['id'];

        // 重新上架商品id
        $relistProductId = $request->param('relistProductId','');

        if (empty($relistProductId)) {

            return json([
                'code' => 422,
                'msg' => "商品id缺失"
            ]);
        }

        try {
            $result = productModel::relistProduct($userId,$relistProductId);

            if ($result) {
                return json([
                    'code' => 200,
                    'msg' => "重新上架成功",
                ]);
            }else{
                return json([
                    'code' => 422,
                    'msg' => "商品不存在或无权删除"
                ]);
            }

        }catch (\Exception $e){
            Log::error('重新上架商品失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));
            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }
    }

    /**
     * 获取编辑商品数据
     * @param Request $request
     * @return \think\response\Json
     */
    public function getEditorProduct(Request $request)
    {

        // 用户信息
        $userId = $request->user['id'];

        // 重新上架商品id
        $productId = $request->param('productId','');

        if (empty($productId)) {

            return json([
                'code' => 422,
                'msg' => "商品id缺失"
            ]);
        }

        try {
            $result = productModel::getEditorProduct($userId,$productId);
            if ($result) {
                return json([
                    'code' => 200,
                    'data' => $result,
                ]);
            }else{
                return json([
                    'code' => 422,
                    'msg' => "商品不存在或无权编辑"
                ]);
            }
        }catch (\Exception $e){
            Log::error('获取编辑商品数据失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));
            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }
    }


    /**
     * 首次获取商品列表
     * @return \think\response\Json
     */
    public function firstGetProductList()
    {
        try {
            $product = productModel::firstGetProductList();

            return json([
                'code' => 200,
                'data' => $product,
            ]);
        }catch (\Exception $e){
            Log::error('首次获取商品数据失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));
            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }
    }

    /**
     * 获取商品详情
     * @param Request $request
     * @return \think\response\Json
     */
    public function getProductInfo(Request $request)
    {
        $productId = $request->param('productId','');

        if (empty($productId)) {
            return json([
                'code' => 422,
                'msg' => "商品id错误"
            ]);
        }

        try {
            $product = productModel::getProductInfo($productId);

            if ($product){
                return json([
                    'code' => 200,
                    'data' => $product,
                ]);
            }else{
                return json([
                    'code' => 422,
                    'msg' => "商品不存在"
                ]);
            }
        }catch (\Exception $e){

            Log::error('获取商品详情失败' . $e->getMessage() . ' | 时间' . date('Y-m-d H:i:s'));

            return json([
                'code' => 500,
                'msg' => "系统异常"
            ]);
        }


    }


    /**
     * 获取商品列表
     * @param Request $request
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function getProductList(Request $request)
    {
        $currentPage = $request->param('currentPage','2');

        $product = productModel::getProductList($currentPage);

        return json([
            'code' => 200,
            'data' => $product,
        ]);
    }
}